/**
  ******************************************************************************
  * @file    controller_protocol_data_def.h
  ******************************************************************************
  */

#ifndef _CONTROLLER_PROTOCOL_DATA_DEF_H_
#define _CONTROLLER_PROTOCOL_DATA_DEF_H_

#ifdef __cplusplus
extern "C"
{
#endif

#include "controller_types.h"

/* 数据长度定义 */
#define CON_MAX_PORT_NUM            (2)        /* 充电接口数量/计量用电能表数量 */
#define CON_MAX_CAR_VIN_LEN         (17)       /* VIN码长度 */

/************************************* 控制器枚举定义 **************************************/

/* 充电枪枪号（编号） */
typedef enum {
    CONGUNNOA = 0x01,
    CONGUNNOB = 0x02,
} con_charge_gunnos_enum;

typedef enum {
    WAIT_STATE = 0,       //待机
    CONF_STATE,           //配置
    CHARGING_STATE,       //充电中
    FULL_STATE,           //充满
    WARRING_STATE,        //告警
    FAULT_STATE,          //故障
    OFFLINE_STATE,        //无线模块 - 离线
    POSITIONING_STATE,    //无线模块 - 定位中
    PISITIONSUCCESS_STATE,//无线模块 - 定位成功
    STARTING_STATE,       //无线模块 - 充电启动中
} con_word_state;

typedef enum {
    /* 命令帧 */
    CON_PRIORITY_START_CHARG                 = 0x04,
    CON_PRIORITY_FEEDBACK_START_CHARG        = 0x04,
    CON_PRIORITY_STOP_CHARG                  = 0x04,
    CON_PRIORITY_FEEDBACK_STOP_CHARG         = 0x04,
    CON_PRIORITY_TIME_SYNC                   = 0x06,
    CON_PRIORITY_FEEDBACK_TIME_SYNC          = 0x06,
    CON_PRIORITY_VERSION_CHECK               = 0x06,
    CON_PRIORITY_FEEDBACK_VERSION_CHECK      = 0x06,
    CON_PRIORITY_STARTUP_FORCE               = 0x04,
    CON_PRIORITY_FEEDBACK_STARTUP_FORCE      = 0x04,
    CON_PRIORITY_LOCK_CTRL                   = 0x04,
    CON_PRIORITY_FEED_BACK_LOCK_CTRL         = 0x04,
    CON_PRIORITY_POWER_CTRL                  = 0x06,
    CON_PRIORITY_FEEDBACK_POWER_CTRL         = 0x06,
    CON_PRIORITY_SYS_SET                     = 0x04,
    CON_PRIORITY_FEEDBACK_SYS_SET            = 0x04,
    CON_PRIORITY_CARINFO                     = 0x04,
    CON_PRIORITY_FEEDBACK_CARINFO            = 0x04,
    CON_PRIORITY_START_UPDATED               = 0x04,
    CON_PRIORITY_FEEDBACK_START_UPDATED      = 0x04,
    CON_PRIORITY_UPDATED_DATA                = 0x04,
    CON_PRIORITY_FEEDBACK_UPDATED_DATA       = 0x04,
    CON_PRIORITY_STOP_UPDATED                = 0x04,
    CON_PRIORITY_FEEDBACK_STOP_UPDATED       = 0x04,
    CON_PRIORITY_SYS_CHECK                   = 0x06,
    CON_PRIORITY_FEEDBACK_SYS_CHECK          = 0x06,

    /* 状态帧 */
    CON_PRIORITY_CHARG_START_RESULT          = 0x04,
    CON_PRIORITY_FEEDBACK_CHARG_START_RESULT = 0x04,
    CON_PRIORITY_CHARG_STOP_RESULT           = 0x04,
    CON_PRIORITY_FEEDBACK_CHARG_STOP_RESULT  = 0x04,

    /* 数据帧 */
    CON_PRIORITY_TELEMETRY                   = 0x06,
    CON_PRIORITY_FEEDBACK_TELEMETRY          = 0x06,
    CON_PRIORITY_TELECOMMAND                 = 0x04,
    CON_PRIORITY_FEEDBACK_TELECOMMAND        = 0x04,
    CON_PRIORITY_WLINE_TELECOMMAND           = 0x04,
    CON_PRIORITY_FEEDBACK_WLINE_TELECOMMAND  = 0x04,

    /* 心跳帧 */
    CON_PRIORITY_HEARTBEAT                   = 0x06,
    CON_PRIORITY_FEEDBACK_HEARTBEAT          = 0x06,

    /* 错误帧 */
    CON_PRIORITY_TCU_ERROR                   = 0x04,
    CON_PRIORITY_CONTROLLER_ERROR            = 0x04,
} con_priority_enum;

typedef enum {
    /* 命令帧 */
    CON_PDUFORMAT_START_CHARG                 = 0x01,
    CON_PDUFORMAT_FEEDBACK_START_CHARG        = 0x02,
    CON_PDUFORMAT_STOP_CHARG                  = 0x03,
    CON_PDUFORMAT_FEEDBACK_STOP_CHARG         = 0x04,
    CON_PDUFORMAT_TIME_SYNC                   = 0x05,
    CON_PDUFORMAT_FEEDBACK_TIME_SYNC          = 0x06,
    CON_PDUFORMAT_VERSION_CHECK               = 0x07,
    CON_PDUFORMAT_FEEDBACK_VERSION_CHECK      = 0x08,
    CON_PDUFORMAT_STARTUP_FORCE               = 0x0B,
    CON_PDUFORMAT_FEEDBACK_STARTUP_FORCE      = 0x0C,
    CON_PDUFORMAT_LOCK_CTRL                   = 0x0D,
    CON_PDUFORMAT_FEED_BACK_LOCK_CTRL         = 0x0E,
    CON_PDUFORMAT_POWER_CTRL                  = 0x0F,
    CON_PDUFORMAT_FEEDBACK_POWER_CTRL         = 0x10,
    CON_PDUFORMAT_SYS_GET_SET                 = 0xA0,
    CON_PDUFORMAT_FEEDBACK_SYS_GET_SET        = 0xA1,
    CON_PDUFORMAT_CARINFO                     = 0xA2,
    CON_PDUFORMAT_FEEDBACK_CARINFO            = 0xA3,
    CON_PDUFORMAT_START_UPDATE                = 0xB0,
    CON_PDUFORMAT_FEEDBACK_START_UPDATE       = 0xB1,
    CON_PDUFORMAT_UPDATE_DATA                 = 0xB2,
    CON_PDUFORMAT_FEEDBACK_UPDATE_DATA        = 0xB3,
    CON_PDUFORMAT_UPDATE_RESULT               = 0xB4,
    CON_PDUFORMAT_FEEDBACK_UPDATE_RESULT      = 0xB5,
    CON_PDUFORMAT_SYS_CHECK                   = 0xC1,
    CON_PDUFORMAT_FEEDBACK_SYS_CHECK          = 0xC2,

    /* 状态帧 */
    CON_PDUFORMAT_CHARG_START_RESULT          = 0x11,
    CON_PDUFORMAT_FEEDBACK_CHARG_START_RESULT = 0x12,
    CON_PDUFORMAT_CHARG_STOP_RESULT           = 0x13,
    CON_PDUFORMAT_FEEDBACK_CHARG_STOP_RESULT  = 0x14,

    /* 数据帧 */
    CON_PDUFORMAT_TELEMETRY                   = 0x20,
    CON_PDUFORMAT_FEEDBACK_TELEMETRY          = 0x21,
    CON_PDUFORMAT_TELECOMMAND                 = 0x22,
    CON_PDUFORMAT_FEEDBACK_TELECOMMAND        = 0x23,
    CON_PDUFORMAT_WLINE_TELECOMMAND           = 0x24,
    CON_PDUFORMAT_FEEDBACK_WLINE_TELECOMMAND  = 0x25,

    /* 心跳帧 */
    CON_PDUFORMAT_HEARTBEAT                   = 0x40,
    CON_PDUFORMAT_FEEDBACK_HEARTBEAT          = 0x41,

    /* 错误帧 */
    CON_PDUFORMAT_TCU_ERROR                   = 0x51,
    CON_PDUFORMAT_CONTROLLER_ERROR            = 0x52,
} con_pduformat_enum;

/*****************************************帧信息*******************************************/

typedef struct {
    uint8_t gunno;                  /* 枪端口号 */
    uint8_t pduformat;              /* 报文类型 */
    uint16_t cycle;                 /* 周期 */
    uint16_t count;                 /* 发送/接收次数 */
    uint32_t timeout;               /* 超时时间 */
    uint64_t time;                  /* 发送/接收时间 */
} con_frame_info_t;

/************************************** 开始字节对齐 ***************************************/

#pragma pack(1)

/*****************************************命令帧*******************************************/

/* 充电启动请求帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t ctrl_flag;              /* 2. 负荷控制开关 */
    uint8_t aps;                    /* 3. 辅助电源电压 */
} con_start_charg_t;

/* 充电启动应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t ctrl_flag;              /* 2. 负荷控制开关 */
    uint8_t start_result;           /* 3. 启动结果 */
} con_feedback_start_charg_t;

/* 充电停止请求帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t result_code;            /* 2. 充电停止原因 */
} con_stop_charg_t;

/* 充电停止应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t result_code;            /* 2. 充电停止原因 */
    uint8_t stop_result;            /* 3. 停止结果 */
} con_feedback_stop_charg_t;

/* 强制启动请求帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  cmd;                   /* 2. 启动指令 */
    uint16_t volt;                  /* 3. 电压设定 */
    uint16_t curr;                  /* 4. 电流设定 */
} con_startup_force_t;

/* 强制启动应答帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  result;                /* 2. 成功标识 */
} con_feedback_startup_force_t;

/* 对时请求帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t time_stamp[7];          /* 2. 时间戳（CP56） */
} con_time_sync_t;

/* 对时应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t time_stamp[7];          /* 2. 时间戳（CP56） */
} con_feedback_time_sync_t;

/* 版本校验请求帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint16_t version;               /* 2. 上位机当前通信协议版本号 */
} con_version_check_t;

/* 版本校验应答帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint16_t version;               /* 2. 上位机当前通信协议版本号 */
    uint8_t  sccu_ver;              /* 3. 充电设备类型 */
    uint8_t  a_swcu_ver;            /* 4. 无线A板软件版本号 */
    uint8_t  a_hwcu_ver;            /* 5. 无线A板硬件版本号 */
    uint8_t  b_swcu_ver;            /* 6. 无线B板软件版本号 */
    uint8_t  b_hwcu_ver;            /* 7. 无线B板硬件版本号 */
} con_feedback_version_check_t;

/* 电子锁控制请求帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t lock_index;             /* 2. 电子锁序号 */
    uint8_t lock_param;             /* 3. 控制 */
} con_lock_ctrl_t;

/* 电子锁控制应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t lock_index;             /* 2. 电子锁序号 */
    uint8_t lock_param;             /* 3. 控制 */
    uint8_t res_code;               /* 4. 结果 */
} con_feedback_lock_ctrl_t;

/* 功率调节请求帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  cmd_type;              /* 2. 功率调节指令类型 */
    uint16_t ctrl_param;            /* 3. 功率调节参数 */
} con_power_ctrl_t;

/* 功率调节应答帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  cmd_type;              /* 2. 功率调节指令类型 */
    uint16_t ctrl_param;            /* 3. 功率调节参数 */
    uint8_t  ctrl_result;           /* 4. 结果 */
} con_feedback_power_ctrl_t;

/* 系统参数配置请求帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  set_type;              /* 2. 参数类型 */
    uint8_t  lock_type;             /* 3. 充电枪锁类型 */
    uint8_t  temp_type;             /* 4. 充电枪温度反馈类型 */
    uint8_t  meter_baud;            /* 5. 电表速率 */
    uint8_t  insulation;            /* 6. 绝缘检测模块 */
    uint8_t  bleed;                 /* 7. 泄放 */
    uint8_t  fan;                   /* 8. 风扇 */
    uint8_t  travel_switch;         /* 9. 行程开关 */
    uint8_t  model_type;            /* 10. 模块类型 */
    uint8_t  lock_fb;               /* 11. 电子锁反馈 */
    uint8_t  in_feedback;           /* 12. 交流进线主接触器及反馈 */
    uint8_t  temp_ctrl;             /* 13. 温度控制 */
    uint8_t  out_sampling;          /* 14. 输出电流电压采样 */
    uint8_t  meter_kw;              /* 15. 电能计量 */
    uint8_t  ct;                    /* 16. 交流电表系数 */
    uint8_t  gnu_type;              /* 17. 充电方式 */
    uint16_t model_vol_max;         /* 18. 模块最高输出电压 */
    uint16_t model_vol_min;         /* 18. 模块最低输出电压 */
    uint16_t model_cur_max;         /* 18. 模块最高输出电流 */
    uint16_t model_cur_min;         /* 18. 模块最低输出电流 */
    uint8_t  gunno_a_model_num;     /* 19. A枪模块数量 */
    uint8_t  gunno_b_model_num;     /* 19. B枪模块数量 */
} con_sys_get_set_t;

/* 系统参数配置应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t set_result;             /* 2. 配置结果 */
} con_feedback_sys_set_t;

/* 系统参数读取应答帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  set_type;              /* 2. 参数类型 */
    uint8_t  lock_type;             /* 3. 充电枪锁类型 */
    uint8_t  temp_type;             /* 4. 充电枪温度反馈类型 */
    uint8_t  meter_baud;            /* 5. 电表速率 */
    uint8_t  insulation;            /* 6. 绝缘检测模块 */
    uint8_t  bleed;                 /* 7. 泄放 */
    uint8_t  fan;                   /* 8. 风扇 */
    uint8_t  travel_switch;         /* 9. 行程开关 */
    uint8_t  model_type;            /* 10. 模块类型 */
    uint8_t  lock_fb;               /* 11. 电子锁反馈 */
    uint8_t  in_feedback;           /* 12. 交流进线主接触器及反馈 */
    uint8_t  temp_ctrl;             /* 13. 温度控制 */
    uint8_t  out_sampling;          /* 14. 输出电流电压采样 */
    uint8_t  meter_kw;              /* 15. 电能计量 */
    uint8_t  ct;                    /* 16. 交流电表系数 */
    uint8_t  gnu_type;              /* 17. 充电方式 */
    uint16_t model_vol_max;         /* 18. 模块最高输出电压 */
    uint16_t model_vol_min;         /* 18. 模块最低输出电压 */
    uint16_t model_cur_max;         /* 18. 模块最高输出电流 */
    uint16_t model_cur_min;         /* 18. 模块最低输出电流 */
    uint8_t  gunno_a_model_num;     /* 19. A枪模块数量 */
    uint8_t  gunno_b_model_num;     /* 19. B枪模块数量 */
} con_feedback_sys_get_t;

/* 获取充电前车辆信息请求帧 */
typedef struct {
    uint8_t gnu_no;                     /* 1. 枪端口号 */
} con_carinfo_t;

/* 获取充电前车辆信息应答帧 */
typedef struct {
    uint8_t gnu_no;                     /* 1. 枪端口号 */
    uint8_t vin[CON_MAX_CAR_VIN_LEN];   /* 2. VIN码 */
} con_feedback_carinfo_t;

/* 升级启动请求帧 */
typedef struct {
    uint32_t length;                    /* 1. */
    uint16_t crc;                       /* 2. */
    uint8_t  version;                   /* 3. */
    uint8_t  type;                      /* 4. */
} con_start_update_t;

/* 升级启动应答帧 */
typedef struct {
    uint8_t result;                     /* 1. */
} con_feedback_start_update_t;

/* 升级数据请求帧 */
typedef struct {
    uint16_t id;                        /* 1. */
    uint8_t  data[6];                   /* 2. */
} con_update_data_t;

/* 升级数据应答帧 */
typedef struct {
    uint16_t id;                        /* 1. */
    uint8_t  result;                    /* 2. */
} con_feedback_update_data_t;

/* 升级结束请求帧 */
typedef struct {
    uint8_t result;                     /* 1. */
    uint8_t reupdate;                   /* 2. */
} con_update_result_t;

/* 系统自检请求帧 */
typedef struct {
    uint8_t cmd;                         /* 系统自检 */
} con_system_check_t;

/* 系统自检应答帧 */
typedef struct {
    uint64_t result : 8;
    uint64_t bit0  : 1;
    uint64_t bit1  : 1;
    uint64_t bit2  : 1;
    uint64_t bit3  : 1;
    uint64_t bit4  : 1;
    uint64_t bit5  : 1;
    uint64_t bit6  : 1;
    uint64_t bit7  : 1;
    uint64_t estop_feedback  : 1;
    uint64_t bit9  : 1;
    uint64_t bit10 : 1;
    uint64_t access_control_feedback : 1;
    uint64_t contactor_relay : 1;
    uint64_t model_parallel_main_positive_relay : 1;
    uint64_t model_parallel_main_negative_relay : 1;
    uint64_t led_feedback : 1;
    uint64_t bit16 : 1;
    uint64_t bit17 : 1;
    uint64_t bit18 : 1;
    uint64_t bit19 : 1;
    uint64_t card_feedback : 1;
    uint64_t bit21 : 1;
    uint64_t bit22 : 1;
    uint64_t bit23 : 1;
    uint64_t model_can_feedback : 1;
    uint64_t bit25 : 1;
    uint64_t bit26 : 1;
    uint64_t       : 64 - 8 - 27;
} con_feedback_system_check_t;

/*****************************************状态帧*******************************************/

/* 启动充电结果请求帧 */
typedef struct {
    uint8_t  gnu_no;                /* 1. 枪端口号 */
    uint8_t  ctrl_flag;             /* 2. 负荷控制开关 */
    uint8_t  start_result;          /* 3. 启动结果 */
    uint8_t  charg_bms_version[3];  /* 4. 充电桩与BMS通信协议版本号 */
    uint8_t  bms_charg_version[3];  /* 5. BMS与充电桩通信协议版本号 */
    uint8_t  Charg_bms_hand_res;    /* 6. 充电桩与BMS握手结果 */
    uint8_t  battrey_type;          /* 7. 电池类型 */
    uint8_t  temp_max;              /* 8. 最高允许温度 */
    uint16_t bms_vol_max;           /* 9. BMS最高允许充电电压 */
    uint16_t vol_max;               /* 10. 单体最高允许电压 */
    uint16_t cur_max;               /* 11. 最高允许充电电流 */
    uint16_t ot_vol;                /* 12. 整车动力蓄电池额定总电压 */
    uint16_t vol;                   /* 13. 整车动力蓄电池当前电压 */
    uint16_t ot_ah;                 /* 14. 整车动力蓄电池额定容量压 */
    uint16_t ot_kwh;                /* 15. 整车动力蓄电池标称能量 */
    uint16_t soc;                   /* 16. 电池荷电状态 */
    uint16_t out_vol_max;           /* 17. 充电机最高输出电压 */
    uint16_t out_vol_min;           /* 18. 充电机最高输出电压 */
    uint16_t out_cur_max;           /* 19. 充电机最高输出电流 */
    uint8_t  vin[CON_MAX_CAR_VIN_LEN];   /* 20. VIN码 */
} con_charg_start_result_t;

/* 启动充电结果应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t ctrl_flag;              /* 2. 负荷控制开关 */
    uint8_t start_result;           /* 3. 启动结果 */
} con_feedback_charg_start_result_t;

/* 停止充电结果请求帧 */
typedef struct {
    uint8_t gnu_no;                                   /* 1. 枪端口号 */
    uint8_t result_code;                              /* 2. 充电停止原因 */
    uint8_t stop_result;                              /* 3. 停止结果 */

    union {
        uint8_t bms_reason_code;                      /* 4. BMS正常终止充电原因 */

        /* 4. BMS正常中止充电原因 */
        struct {
            uint8_t bms_reason_code_soc    : 2;           /* 4. BMS正常终止充电原因: 0 ~ 1: 达到所需求的SOC目标值 */
            uint8_t bms_reason_code_bms_vol: 2;           /* 4. BMS正常终止充电原因: 2 ~ 3: 达到总电压的设定值 */
            uint8_t bms_reason_code_vol    : 2;           /* 4. BMS正常终止充电原因: 4 ~ 5: 达到单体电压的设定值 */
            uint8_t bms_reason_code_stop   : 2;           /* 4. BMS正常终止充电原因: 6 ~ 7: 充电机主动终止 */
        };
    } con_bms_reason_code;

    union {
        uint16_t bms_fault_code;                      /* 5. BMS故障终止充电原因 */

        /* 5. BMS故障终止充电原因 */
        struct {
            uint16_t bms_fault_code_insulation       : 2; /* 5. BMS故障终止充电原因: 0 ~   1: 绝缘故障 */
            uint16_t bms_fault_code_out_link_overtemp: 2; /* 5. BMS故障终止充电原因: 2 ~   3: 输出连接器过温故障 */
            uint16_t bms_fault_code_bms_overtemp     : 2; /* 5. BMS故障终止充电原因: 4 ~   5: BMS元器件过温故障 */
            uint16_t bms_fault_code_charg_link       : 2; /* 5. BMS故障终止充电原因: 6 ~   7: 充电连接器故障 */
            uint16_t bms_fault_code_battery_overtemp : 2; /* 5. BMS故障终止充电原因: 8 ~   9: 电池组温度过高故障 */
            uint16_t bms_fault_code_hv_relay         : 2; /* 5. BMS故障终止充电原因: 10 ~ 11: 高压继电器（high-voltage relay）故障 */
            uint16_t bms_fault_code_cc2              : 2; /* 5. BMS故障终止充电原因: 12 ~ 13: 检测点2电压检测故障 */
            uint16_t bms_fault_code_other            : 2; /* 5. BMS故障终止充电原因: 14 ~ 15: 其他故障 */
        };
    } con_bms_fault_code;

    union {
        uint8_t bms_error_code;                       /* 6. BMS异常终止错误原因 */

        /* 6. BMS中止错误原因 */
        struct {
            uint8_t bms_error_code_cur: 2;                /* 6. BMS异常终止错误原因: 0 ~ 1: 电流 */
            uint8_t bms_error_code_vol: 2;                /* 6. BMS异常终止错误原因: 2 ~ 3: 电压 */
            uint8_t                   : 4;
        };
    } con_bms_error_code;

    uint8_t  soc;                                     /* 7. 中止荷电状态 */
    uint16_t vol_min;                                 /* 8. 动力蓄电池单体最低电压 */
    uint16_t vol_max;                                 /* 9. 动力蓄电池单体最高电压 */
    uint8_t  temp_min;                                /* 10. 动力蓄电池最低允许温度 */
    uint8_t  temp_max;                                /* 11. 动力蓄电池最高允许温度 */

    union {
        uint8_t spn2560xx_timeout;

        struct {
            uint8_t spn256000_timeout            : 2;     /* 12. 0 ~ 1: 接收SPN2560=0x00的充电机报文识别超时 */
            uint8_t spn2560aa_timeout            : 2;     /* 12. 2 ~ 3: 接收SPN2560=0xAA的充电机报文识别超时 */
            uint8_t                              : 4;
        };
    } con_spn2560xx_timeout;

    union {
        uint8_t bms_tmra_timeout;

        struct {
            uint8_t timesync_and_maxpower_timeout: 2;     /* 13. 0 ~ 1: 接收充电机的时间同步和充电机最大输出能力报文超时 */
            uint8_t ready_charg_timeout          : 2;     /* 13. 2 ~ 3: 接收充电机完成充电准备报文超时 */
            uint8_t                              : 4;
        };
    } con_bms_tmra_timeout;

    union {
        uint8_t bms_cscs_timeout;

        struct {
            uint8_t charg_status_timeout         : 2;     /* 14. 0 ~ 1: 接收充电机充电状态报文超时 */
            uint8_t charg_stop_timeout           : 2;     /* 14. 2 ~ 3: 接收充电机终止充电报文超时 */
            uint8_t                              : 4;
        };
    } con_bms_cscs_timeout;

    union {
        uint8_t bms_csbo_timeout;

        struct {
            uint8_t charg_statistics_timeout     : 2;     /* 15. 0 ~ 1: 接收充电机充电统计报文超时 */
            uint8_t bms_other_error              : 2;     /* 15. 2 ~ 3: BMS其他错误 */
            uint8_t                              : 4;
        };
    } con_bms_csbo_timeout;

    union {
        uint8_t bms_bms_timeout;

        struct {
            uint8_t bms_timeout                  : 2;     /* 16. 0 ~ 1: 接收BMS和车辆的识别报文超时 */
            uint8_t                              : 6;
        };
    } con_bms_timeout;

    union {
        uint8_t bms_bpbrc_timeout;

        struct {
            uint8_t battery_param_timeout        : 2;     /* 17. 0 ~ 1: 接收电池充电参数报文超时 */
            uint8_t bms_ready_charg_timeout      : 2;     /* 17. 2 ~ 3: 接收BMS完成充电准备报文超时 */
            uint8_t                              : 4;
        };
    } con_bms_bpbrc_timeout;

    union {
        uint8_t bms_bsbcbsc_timeout;

        struct {
            uint8_t batter_status_timeout        : 2;     /* 18. 0 ~ 1: 接收电池充电总状态报文超时 */
            uint8_t batter_charg_timeout         : 2;     /* 18. 2 ~ 3: 接收电池充电要求报文超时 */
            uint8_t bms_stop_charg_timeout       : 2;     /* 18. 4 ~ 5: 接收BMS终止充电报文超时 */
            uint8_t                              : 2;
        };
    } con_bms_bsbcbsc_timeout;

    union {
        uint8_t bms_bscoe_timeout;

        struct {
            uint8_t bms_statistics_timeout       : 2;     /* 19. 0 ~ 1: 接收BMS充电统计报文超时 */
            uint8_t charg_other_error            : 2;     /* 19. 2 ~ 3: 充电机其他错误 */
            uint8_t                              : 4;
        };
    } con_bms_bscoe_timeout;

    uint8_t fault_code_one;                           /* 20. 故障码1 */
    uint8_t fault_code_two;                           /* 21. 故障码2 */
} con_charg_stop_result_t;

/* 停止充电结果应答帧 */
typedef struct {
    uint8_t gnu_no;                 /* 1. 枪端口号 */
    uint8_t result_code;            /* 2. 充电停止原因 */
    uint8_t stop_result;            /* 3. 停止结果 */
} con_feedback_charg_stop_result_t;

/*****************************************数据帧*******************************************/

/* 遥测请求帧 */
typedef struct {
    uint8_t  gnu_no;                 /* 1. 枪端口号 */
    uint16_t charg_out_vol;          /* 2. 充电输出电压 */
    uint16_t charg_out_cur;          /* 2. 充电输出电流 */
    uint16_t soc;                    /* 3. SOC */
    uint16_t temp_min;               /* 4. 电池组最低温度 */
    uint16_t temp_max;               /* 5. 电池组最高温度 */
    uint16_t vol_max;                /* 6. 单体电池最高电压 */
    uint16_t vol_min;                /* 7. 单体电池最低电压 */
    uint16_t charg_entemp;           /* 8. 充电机环境温度 */
    uint16_t charg_guid_vol;         /* 9. 充电引导电压 */
    uint16_t surpl_charg_time;       /* 10. 剩余充电时间 */
    uint16_t vol;                    /* 11. 当前单体电池电压 */
    uint32_t power;                  /* 12. 充电功率 */
    uint32_t elect;                  /* 13. 充电电量 */
    uint16_t demand_vol;             /* 14. 需求电压 */
    uint16_t demand_cur;             /* 15. 需求电流 */
} con_telemetry_t;

/* 遥测应答帧 */
typedef struct {
    uint8_t  gnu_no;                 /* 1. 枪端口号 */
    uint16_t elect;                  /* 2. 当前充电电量 */
    uint16_t charg_time;             /* 3. 当前充电时间 */
} con_feedback_telemetry_t;

/* 遥信请求帧 */
typedef struct {
    uint8_t gnu_no;                              /* 1. 枪端口号 */
    uint8_t work_state                     : 4;  /* 2. 0 ~ 3: 工作状态 */
    uint8_t scram_fault                    : 1;  /* 2. 4: 急停故障 */
    uint8_t door_fault                     : 1;  /* 2. 5：门锁故障 */
    uint8_t ac_breaker_fault               : 1;  /* 2. 6: 交流断路器故障 */
    uint8_t output_con_fault               : 1;  /* 2. 7: 直流母线输出接触器故障 */
    uint8_t dc_bus_out_fuse_fault          : 1;  /* 3. 0: 直流母线输出熔断器故障 */
    uint8_t electronic_lock_fault          : 1;  /* 3. 1: 充电接口电子锁故障 */
    uint8_t charg_fan_fault                : 1;  /* 3. 2: 充电机风扇故障 */
    uint8_t battery_vol_overtop            : 1;  /* 3. 3: 电池电压过高 */
    uint8_t insulation_fault               : 1;  /* 3. 4: 绝缘检测故障 */
    uint8_t batter_transp_fault            : 1;  /* 3. 5: 电池反接故障 */
    uint8_t bus_ct_guid_alarm              : 1;  /* 3. 6: 充电中车辆控制引导告警 */
    uint8_t charg_over_fault               : 1;  /* 3. 7: 充电桩过温故障 */
    uint8_t charg_gun_over_fault           : 1;  /* 4. 0: 充电枪过温故障 */
    uint8_t charger_fault                  : 1;  /* 4. 1: 充电枪未归位 */
    uint8_t bms_com_fault                  : 1;  /* 4. 2: BMS通信异常  */
    uint8_t input_over_vol                 : 1;  /* 4. 3: 输入电压过压 */
    uint8_t input_under_vol                : 1;  /* 4. 4: 输入电压欠压 */
    uint8_t dc_bus_over_vol_alarm          : 1;  /* 4. 5: 直流母线输出过压告警 */
    uint8_t dc_bus_under_vol_alarm         : 1;  /* 4. 6: 直流母线输出欠压告警 */
    uint8_t dc_bus_over_cur_alarm          : 1;  /* 4. 7: 直流母线输出过流 */
    uint8_t charg_mod_fault                : 1;  /* 5. 0: 充电模块故障 */
    uint8_t charg_mod_ac_input_alarm       : 1;  /* 5. 1: 充电模块交流输入告警 */
    uint8_t charg_mod_input_over_vol_alarm : 1;  /* 5. 2: 充电模块输入过压告警 */
    uint8_t charg_mod_input_under_vol_alarm: 1;  /* 5. 3: 充电模块输入欠压告警  */
    uint8_t charg_mod_input_phase_alarm    : 1;  /* 5. 4: 充电模块输入缺相告警 */
    uint8_t charg_mod_out_short_cir_fault  : 1;  /* 5. 5: 充电模块输出短路故障 */
    uint8_t charg_mod_out_over_cur_alarm   : 1;  /* 5. 6: 充电模块输出过流告警 */
    uint8_t charg_mod_out_over_vol_alarm   : 1;  /* 5. 7: 充电模块输出过压告警 */
    uint8_t charg_mod_out_under_vol_alarm  : 1;  /* 6. 0: 充电模块输出欠压告警 */
    uint8_t charg_mod_over_temp_alarm      : 1;  /* 6. 1: 充电模块过温报警 */
    uint8_t charg_mod_com_alarm            : 1;  /* 6. 2: 充电模块通信告警 */
    uint8_t charg_mod_fan_fault            : 1;  /* 6. 3: 充电模块风扇故障 */
    uint8_t connect_bus                    : 1;  /* 6. 4: 是否连接车辆 */
    uint8_t charg_emp_fault                : 1;  /* 6. 5: 充电桩充电枪座故障 */
    uint8_t electronic_lock_state          : 1;  /* 6. 6: 充电接口电子锁状态 */
    uint8_t dc_output_con_state            : 1;  /* 6. 7: 直流输出接触器状态 */
    uint8_t meter_fault                    : 1;  /* 7. 0: 电表故障 */
    uint8_t insult_module_fault            : 1;  /* 7. 1: 绝缘模块故障 */
    uint8_t bleed_fault                    : 1;  /* 7. 2: 泄放故障 */
    uint8_t charg_para_no                  : 1;  /* 7. 3: 充电参数未分配 */
    uint8_t battery_vol_inconformity       : 1;  /* 7. 4: 电池电压不匹配 */
    uint8_t k1state                        : 1;  /* 7. 5: k1输出状态 */
    uint8_t k2state                        : 1;  /* 7. 6: k2输出状态 */
    uint8_t switch_K1state                 : 1;  /* 7. 7: 投切开关K+状态 */
    uint8_t switch_K2state                 : 1;  /* 8. 1: 投切开关K-状态 */
    uint8_t                                : 7;
} con_telecommand_t;

/* 遥信应答帧 */
typedef struct {
    uint8_t  gnu_no;                 /* 1. 枪端口号 */
} con_feedback_telecommand_t;

/* 无线遥信请求帧 */
typedef struct {
    uint64_t dec;                    /* 1. DTC */
} con_wline_telecommand_t;

/* 无线遥信应答帧 */
typedef struct {
    uint8_t  gnu_no;                 /* 1. 枪端口号 */
} con_feedback_wline_telecommand_t;

/*****************************************心跳帧*******************************************/

/* 心跳请求帧 */
typedef struct {
    uint8_t gnu_no;                  /* 1. 枪端口号 */
    uint8_t sequence_number;         /* 2. 心跳报文发送计数 */
    uint8_t status;                  /* 3. 报文接收状态 */
} con_heartbeat_t;

/* 心跳应答帧 */
typedef struct {
    uint8_t gnu_no;                  /* 1. 枪端口号 */
    uint8_t sequence_number;         /* 2. 心跳报文发送计数 */
    uint8_t status;                  /* 3. 报文接收状态 */
    uint8_t server_state;            /* 4. 当前充电服务状态 */
} con_feedback_heartbeat_t;

/*****************************************错误帧*******************************************/

/* TCU错误帧 */
typedef struct {
    uint8_t gnu_no;                         /* 1. 枪端口号 */
    uint8_t version_check_timeout     : 1;  /* 2. 0: 版本校验超时 */
    uint8_t sys_set_timeout           : 1;  /* 2. 1: 参数设置超时 */
    uint8_t charg_start_cmd_timeout   : 1;  /* 2. 2: 启动充电命令超时 */
    uint8_t charg_start_result_timeout: 1;  /* 2. 3: 等待启动充电完成超时 */
    uint8_t charg_stop_cmd_timeout    : 1;  /* 2. 4: 停止充电命令超时 */
    uint8_t charg_stop_result_timeout : 1;  /* 2. 5: 等待停止充电完成超时 */
    uint8_t                           : 2;
} con_tcu_error_t;

/* 充电控制器错误帧 */
typedef struct {
    uint8_t gnu_no;                         /* 1. 枪端口号 */
    uint8_t charg_start_result_timeout: 1;  /* 2. 0: 充电启动完成状态确认超时 */
    uint8_t charg_stop_result_timeout : 1;  /* 2. 1: 充电停止完成状态确认超时 */
    uint8_t                           : 6;
} con_controller_error_t;

#pragma pack() /* #pragma pack(1) */

/************************************** 结束字节对齐 ***************************************/

#ifdef __cplusplus
}
#endif

#endif /* _CONTROLLER_PROTOCOL_DATA_DEF_H_ */
